/**
    1. Promise 就是一个类 在执行这个类的时候 需要传递进去一个执行器 执行器会立即执行
    2. Promise 中有三种状态 分别为 成功 => fulfilled 失败 => rejected 等待 => pending
    pending => fulfilled
    pending => rejected
    一旦状态确定就不可改变
    3. resolve 和 reject 函数是用来更改状态的
        resolve：fulfilled
        reject：rejected
    4. then方法内部做的事情就是判断状态 如果状态是成功 调用成功的回调函数 如果状态是失败 调用的就是失败的回调
    5. then成功回调有一个参数 表示成功之后的值 then失败回调有一个失败 表示失败的原因
 */

const MyPromise = require('./myPromise')

const promise = new MyPromise((resolve, reject) => {
    // throw new Error('aa')

    // resolve('成功')

    setTimeout(() => {
        // resolve('成功')
        reject('失败')
    }, 1000)
    // reject('失败')
})

function other() {
    return new Promise((resolve, reject) => {
        resolve('other')
    })
}

// const p1 = 
// promise.then((res) => {
//     console.log(1)
//     console.log(res, 'res')
//     // throw new Error('bb')
//     // return p1
//     return 'aa'
// }, (err) => {
//     console.log(err, 'err')
//     return 1000
// })
// .then((value) => {
//     console.log(value, '第二个then')
// }, (err) => {
//     console.log(err)
// })

// p1.then((val) => {
//     console.log(val)
// }, (err) => {
//     console.log(err.message)
// })

// promise.then((res) => {
//     console.log(2)
//     console.log(res, 'res')
// }, (err) => {
//     console.log(err, 'err')
// })

// promise.then((res) => {
//     console.log(3)
//     console.log(res, 'res')
// }, (err) => {
//     console.log(err, 'err')
// })

// console.log(promise)

// promise.then()
//         .then()
//         .then(console.log)

const p1 = new MyPromise((resolve, reject) => {
    setTimeout(() => {
        resolve('aa')
    })
})

const p2 = new MyPromise((resolve, reject) => {
    // resolve('bb')
    reject('cc')
})

// MyPromise.all(['1', '2', p1, p2, '3']).then((res) => {
//     console.log(res)
// })

// MyPromise.resolve(p1).then(value => console.log(value))

// p2.finally(() => {
//     return p1
// }).then((value) => {
//     console.log(value)
// })

// p2
// .then((value) => console.log(value))
// .catch((err) => console.log(err))
// ccbca
MyPromise.allSettled(['1', '2', p1, p2, '3']).then((res) => {
    console.log(res)
})
